package com.up.vms.infrastructure.util;

import org.apache.commons.lang3.StringUtils;

import java.util.UUID;

/**
 * 金额数据的转换工具类
 *
 * Author: wangshd
 */

public class ConvertDataUtil {

    public ConvertDataUtil() {
        super();
    }

    /**
     * 将金额转换为字符串，单位为分的整数
     *
     * @return String
     */
    public static String convertAmountToString(double data) {
        long lTemp = Math.round(data * 100);
        return String.valueOf(lTemp);
    }

    /**
     * 将字符串转换为金额，单位为元
     *
     * @param data
     * @return
     * @throws Exception
     */
    public static double convertStringToAmount(String data) throws Exception {
        if (data != null && !"".equals(data)) {
            double dTemp = Double.valueOf(data).doubleValue();

            return dTemp / 100;
        }

        return 0.0;
    }

    /**
     * 销售订单编号生成器
     * 服务器集群编号 + UUID的hashcode, 确保在高并发场景下的订单号的唯一性
     * @return
     */
    public static String getOrderNoByUUId(){
        int machineId = 1;
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if(hashCodeV < 0){
            hashCodeV = -hashCodeV;
        }
        StringBuilder orderNo = new StringBuilder();
        return orderNo.append(machineId).append(String.format("%011d", hashCodeV)).toString();
    }

    public static String subString(String str, int len) {
        if (StringUtils.isBlank(str)) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length() && len > 0; i++) {
            // 如果是汉字算2个长度。
            if (!isDbcCase(str.charAt(i))) {
                // 如果是汉字且不是最后一个字符，就加上，否则不加
                if (len > 1) {
                    sb.append(str.charAt(i));
                    len -= 2;
                }
                // 不是汉字只算一个长度
            } else {
                sb.append(str.charAt(i));
                len--;
            }
        }
        return sb.toString();
    }

    /**
     * 半角、全角字符判断
     *
     * @param c 字符
     * @return true：半角； false：全角
     */
    public static boolean isDbcCase(char c) {
        // 基本拉丁字母（即键盘上可见的，空格、数字、字母、符号）
        if (c >= 32 && c <= 127) {
            return true;
        }
        // 日文半角片假名和符号
        else if (c >= 65377 && c <= 65439) {
            return true;
        }
        return false;
    }


}
